﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using Model;
using Interface;
using System.Xml;

namespace Controller
{
    public class ValgmaskineController
    {
        bool _threadRunning = true;
        DBFacade _dbf;
        Valg _valg;
        int _pollInterval;

        public ValgmaskineController()
        {
            try
            {
                using (StreamReader sr = new StreamReader("Config.txt"))
                {
                    string line = sr.ReadLine();
                    string[] split = line.Split(' ');
                    _pollInterval = Convert.ToInt32(split[2]);
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            _dbf = new DBFacade();
            _valg = new Valg();
            //Thread DBThread = new Thread(ReadDB);
            //DBThread.Start();
            RunNulValg();
        }

        public List<ILandskreds> GetLandskreds()
        {
            List<ILandskreds> lk = new List<ILandskreds>();
            foreach (Landskreds l in _valg.Landskreds.Values)
            {
                lk.Add(l);
            }
            return lk;
        }

        public List<IOpstillingskreds> GetOpstillingskreds(int okId)
        {
            List<IOpstillingskreds> ok = new List<IOpstillingskreds>();
            foreach (Opstillingskreds o in _valg.Landskreds[okId].Opstillingskreds.Values)
            {
                ok.Add(o);
            }
            return ok;
        }

        public List<IStorkreds> GetStorkreds(int okId, int skId)
        {
            List<IStorkreds> sk = new List<IStorkreds>();
            foreach (Storkreds s in _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds.Values)
            {
                sk.Add(s);
            }
            return sk;
        }

        public List<IAfstemningsOmråde> GetAfstemningsområde(int okId, int skId, int aoId)
        {
            List<IAfstemningsOmråde> ao = new List<IAfstemningsOmråde>();
            foreach (AfstemningsOmråde a in _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Afstemningsområde.Values)
            {
                ao.Add(a);
            }
            return ao;
        }

        public List<IListe> GetListe(int okId, int skId, int aoId, int vsId, string niveau)
        {
            bool stop = false;
            List<IListe> liste = new List<IListe>();
            if (niveau == "0")
            {
                foreach (int ok in _valg.Landskreds.Keys)
                {
                    foreach (int sk in _valg.Landskreds[ok].Opstillingskreds.Keys)
                    {
                        foreach (Liste l in _valg.Landskreds[ok].Opstillingskreds[sk].Parti.Values)
                        {
                            if (liste.Count != 0)
                            {
                                for (int i = 0; i < liste.Count; i++)
                                {
                                    if (liste[i].Navn == l.Navn)
                                    {
                                        stop = true;                                        
                                        break;
                                    }
                                }
                                if (stop != true)
                                {
                                    liste.Add(l);
                                }
                            }
                            else
                            {
                                liste.Add(l);
                            }
                            stop = false;
                        }
                    }
                }
            }
            else if (niveau == "1")
            {
                foreach (int sk in _valg.Landskreds[okId].Opstillingskreds.Keys)
                {
                    foreach (Liste l in _valg.Landskreds[okId].Opstillingskreds[sk].Parti.Values)
                    {
                        if (liste.Count != 0)
                        {
                            for (int i = 0; i < liste.Count; i++)
                            {
                                if (liste[i].Navn == l.Navn)
                                {
                                    stop = true;
                                    break;
                                }
                            }
                            if (stop != true)
                            {
                                liste.Add(l);
                            }
                        }
                        else
                        {
                            liste.Add(l);
                        }
                        stop = false;
                    }
                }
            }
            else if (niveau == "2")
            {
                foreach (Liste l in _valg.Landskreds[okId].Opstillingskreds[skId].Parti.Values)
                {
                    liste.Add(l);
                }
            }
            else if (niveau == "3")
            {
                foreach (Liste l in _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Parti.Values)
                {
                    liste.Add(l);
                }
            }
            else if (niveau == "4")
            {
                foreach (Liste l in _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Afstemningsområde[vsId].Parti.Values)
                {
                    liste.Add(l);
                }
            }
            return liste;
        }

        public int GetStemmeBerettigede(int okId, int skId, int aoId, int vsId, string niveau)
        {
            int antalStemmeBerettigede = -1;
            /*if (niveau == "0")
            {
                antalStemmeBerettigede = _valg.stemmeberettigede;
            }
            else if (niveau == "1")
            {
                antalStemmeBerettigede = _valg.Landskreds[skId].stemmeberettigede;
            }
            else if (niveau == "2")
            {
                antalStemmeBerettigede = _valg.Landskreds[skId].Storkreds[okId].stemmeberettigede;
            }
            else if (niveau == "3")
            {
                antalStemmeBerettigede = _valg.Landskreds[skId].Storkreds[okId].Opstillingskreds[aoId].stemmeberettigede;
            }
            else if (niveau == "4")
            {
                antalStemmeBerettigede = _valg.Landskreds[skId].Storkreds[okId].Opstillingskreds[aoId].Afstemningsområde[vsId].stemmeberettigede;
            } 
            return antalStemmeBerettigede;*/

            // Eksempel på switch-statement; en anden måde, at lave en if, if-else på:
            // (evt. else - dette ville således forklares ved 'default: <kode>')
            switch (niveau)
            {
                case "0":
                    foreach (int ok in _valg.Landskreds.Keys)
                    {
                        antalStemmeBerettigede += _valg.Landskreds[ok].stemmeberettigede;
                    }
                    break;
                case "1":
                    antalStemmeBerettigede = _valg.Landskreds[okId].stemmeberettigede;
                    break;
                case "2":
                    antalStemmeBerettigede = _valg.Landskreds[okId].Opstillingskreds[skId].stemmeberettigede;
                    break;
                case "3":
                    antalStemmeBerettigede = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].stemmeberettigede;
                    break;
                case "4":
                    antalStemmeBerettigede = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Afstemningsområde[vsId].stemmeberettigede;
                    break;
            }
            return antalStemmeBerettigede;
        }

        public int GetOptalteStemmer(int okId, int skId, int aoId, int vsId, string niveau)
        {
            int optalteStemmer = -1;
            if (niveau == "0")
            {
                foreach (int ok in _valg.Landskreds.Keys)
                {
                    optalteStemmer += _valg.Landskreds[ok].ialt_afgivet;
                }
            }
            else if (niveau == "1")
            {
                optalteStemmer = _valg.Landskreds[okId].ialt_afgivet;
            }
            else if (niveau == "2")
            {
                optalteStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].ialt_afgivet;
            }
            else if (niveau == "3")
            {
                optalteStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].ialt_afgivet;
            }
            else if (niveau == "4")
            {
                optalteStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Afstemningsområde[vsId].ialt_afgivet;
            }
            return optalteStemmer;
        }

        public decimal GetProcentStemmer(int okId, int skId, int aoId, int vsId, string niveau)
        {
            decimal procentStemmer = -1;
            if (niveau == "0")
            {
                foreach (int ok in _valg.Landskreds.Keys)
                {
                    procentStemmer += _valg.Landskreds[ok].stemme_pct;
                }
            }
            else if (niveau == "1")
            {
                procentStemmer = _valg.Landskreds[okId].stemme_pct;
            }
            else if (niveau == "2")
            {
                procentStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].stemme_pct;
            }
            else if (niveau == "3")
            {
                procentStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].stemme_pct;
            }
            else if (niveau == "4")
            {
                procentStemmer = _valg.Landskreds[okId].Opstillingskreds[skId].Storkreds[aoId].Afstemningsområde[vsId].stemme_pct;
            }
            return procentStemmer;
        }

        //private void ReadDB()
        //{
        //    int id = 0;
        //    while (_threadRunning)
        //    {
        //        bool succes = _dbf.UpdateModelFromDB(id + 1);
        //        if (succes)
        //            id++;
        //        else
        //            Thread.Sleep(_pollInterval * 1000);
        //    }
        //}

        //private void ReadDB()
        //{
        //    int id = 0;
        //    while (_threadRunning)
        //    {
        //        bool succes = _dbf.UpdateModelFromDB(id + 1);
        //        if (succes)
        //            id++;
        //        else
        //            Thread.Sleep(_pollInterval * 1000);
        //    }
        //}

        private void RunNulValg()
        {
            XmlTextReader reader = new XmlTextReader("0B20071113144621.xml");
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.AttributeCount > 1)
                    {
                        if (reader.GetAttribute(1).ToString() == "afstemningsområde")
                        {
                            int lkreds = Convert.ToInt32(reader.GetAttribute(4));
                            int kre = Convert.ToInt32(reader.GetAttribute(5));
                            int kom = Convert.ToInt32(reader.GetAttribute(6));
                            int afs = Convert.ToInt32(reader.GetAttribute(7));
                            if (!_valg.Landskreds.ContainsKey(lkreds))
                                _valg.Landskreds.Add(lkreds, new Landskreds(lkreds));
                            if (!_valg.Landskreds[lkreds].Opstillingskreds.ContainsKey(kre))
                                _valg.Landskreds[lkreds].Opstillingskreds.Add(kre, new Opstillingskreds(kre));
                            if (!_valg.Landskreds[lkreds].Opstillingskreds[kre].Storkreds.ContainsKey(kom))
                                _valg.Landskreds[lkreds].Opstillingskreds[kre].Storkreds.Add(kom, new Storkreds(kom));
                            if (!_valg.Landskreds[lkreds].Opstillingskreds[kre].Storkreds[kom].Afstemningsområde.ContainsKey(afs))
                                _valg.Landskreds[lkreds].Opstillingskreds[kre].Storkreds[kom].Afstemningsområde.Add(afs, new AfstemningsOmråde(afs));
                        }
                    }
                }
            }
            XmlDocument doc = new XmlDocument();
            doc.Load("0B20071113144621.xml");
            foreach (XmlNode node in doc.DocumentElement.ChildNodes)
            {
                int kommuneid = 0;
                if (node.Name.ToString() == "VALGDATA")
                {
                    if (node.Attributes.Count >= 3)
                    {
                        if (node.Attributes["type"].Value.ToString() == "kommune")
                        {
                            foreach (Opstillingskreds stk in _valg.Landskreds[Convert.ToInt32(node.Attributes[4].Value)].Opstillingskreds.Values)
                            {
                                if (stk.Storkreds.ContainsKey(Convert.ToInt32(node.Attributes[5].Value)))
                                {
                                    kommuneid = stk.Id;
                                    break;
                                }
                            }
                            Storkreds aktuelstorkreds = _valg.Landskreds[Convert.ToInt32(node.Attributes[4].Value)].Opstillingskreds[kommuneid].Storkreds[Convert.ToInt32(node.Attributes[5].Value)];
                            aktuelstorkreds.ialt_afgivet = Convert.ToInt32(node.FirstChild.Attributes[8].Value);
                            aktuelstorkreds.forrige_rest = Convert.ToInt32(node.FirstChild.Attributes[7].Value);
                            aktuelstorkreds.forrige_blanke = Convert.ToInt32(node.FirstChild.Attributes[6].Value);
                            aktuelstorkreds.blanke = Convert.ToInt32(node.FirstChild.Attributes[5].Value);
                            aktuelstorkreds.forrige_ugyldige = Convert.ToInt32(node.FirstChild.Attributes[4].Value);
                            aktuelstorkreds.ugyldige = Convert.ToInt32(node.FirstChild.Attributes[3].Value);
                            aktuelstorkreds.stemmeberettigede = Convert.ToInt32(node.FirstChild.Attributes[2].Value);
                            aktuelstorkreds.forrige_pct = Convert.ToDecimal(node.FirstChild.Attributes[1].Value.Replace('.', ','));
                            aktuelstorkreds.stemme_pct = Convert.ToDecimal(node.FirstChild.Attributes[0].Value.Replace('.', ','));
                            foreach (XmlNode childliste in node.FirstChild.ChildNodes)
                            {
                                if (childliste.Name == "LISTE")
                                {
                                    Liste l;
                                    if (childliste.Attributes.Count == 7)
                                    {
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[6].Value), Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                        foreach (XmlNode childkandidat in childliste.ChildNodes)
                                        {
                                            l.Kandidat.Add(new Kandidat(childkandidat.Attributes[0].Value.ToString(), Convert.ToInt32(childkandidat.Attributes[1].Value)));
                                        }
                                    }
                                    else
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), -1, Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                    aktuelstorkreds.Parti.Add(childliste.Attributes[0].Value.ToString(), l);
                                }
                            }
                        }
                        else if (node.Attributes["type"].Value.ToString() == "kreds")
                        {
                            Opstillingskreds aktuelkreds = _valg.Landskreds[Convert.ToInt32(node.Attributes[4].Value)].Opstillingskreds[Convert.ToInt32(node.Attributes[5].Value)];
                            aktuelkreds.stemme_pct = Convert.ToDecimal(node.FirstChild.Attributes[0].Value.Replace('.', ','));
                            aktuelkreds.forrige_pct = Convert.ToDecimal(node.FirstChild.Attributes[1].Value.Replace('.', ','));
                            aktuelkreds.stemmeberettigede = Convert.ToInt32(node.FirstChild.Attributes[2].Value);
                            aktuelkreds.ugyldige = Convert.ToInt32(node.FirstChild.Attributes[3].Value);
                            aktuelkreds.forrige_ugyldige = Convert.ToInt32(node.FirstChild.Attributes[4].Value);
                            aktuelkreds.blanke = Convert.ToInt32(node.FirstChild.Attributes[5].Value);
                            aktuelkreds.forrige_blanke = Convert.ToInt32(node.FirstChild.Attributes[6].Value);
                            aktuelkreds.forrige_rest = Convert.ToInt32(node.FirstChild.Attributes[7].Value);
                            aktuelkreds.ialt_afgivet = Convert.ToInt32(node.FirstChild.Attributes[8].Value);
                            foreach (XmlNode childliste in node.FirstChild.ChildNodes)
                            {
                                if (childliste.Name == "LISTE")
                                {
                                    Liste l;
                                    if (childliste.Attributes.Count == 7)
                                    {
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[6].Value), Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                        foreach (XmlNode childkandidat in childliste.ChildNodes)
                                        {
                                            l.Kandidat.Add(new Kandidat(childkandidat.Attributes[0].Value.ToString(), Convert.ToInt32(childkandidat.Attributes[1].Value)));
                                        }
                                    }
                                    else
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), -1, Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                    aktuelkreds.Parti.Add(childliste.Attributes[0].Value.ToString(), l);
                                }
                            }
                        }
                        else if (node.Attributes["type"].Value.ToString() == "afstemningsområde")
                        {
                            AfstemningsOmråde aktuelafstemningsområde = _valg.Landskreds[Convert.ToInt32(node.Attributes[4].Value)].Opstillingskreds[Convert.ToInt32(node.Attributes[5].Value)].Storkreds[Convert.ToInt32(node.Attributes[6].Value)].Afstemningsområde[Convert.ToInt32(node.Attributes[7].Value)];
                            aktuelafstemningsområde.stemme_pct = Convert.ToDecimal(node.FirstChild.Attributes[0].Value.Replace('.', ','));
                            aktuelafstemningsområde.forrige_pct = Convert.ToDecimal(node.FirstChild.Attributes[1].Value.Replace('.', ','));
                            aktuelafstemningsområde.stemmeberettigede = Convert.ToInt32(node.FirstChild.Attributes[2].Value);
                            aktuelafstemningsområde.ugyldige = Convert.ToInt32(node.FirstChild.Attributes[3].Value);
                            aktuelafstemningsområde.forrige_ugyldige = Convert.ToInt32(node.FirstChild.Attributes[4].Value);
                            aktuelafstemningsområde.blanke = Convert.ToInt32(node.FirstChild.Attributes[5].Value);
                            aktuelafstemningsområde.forrige_blanke = Convert.ToInt32(node.FirstChild.Attributes[6].Value);
                            aktuelafstemningsområde.forrige_rest = Convert.ToInt32(node.FirstChild.Attributes[7].Value);
                            aktuelafstemningsområde.ialt_afgivet = Convert.ToInt32(node.FirstChild.Attributes[8].Value);
                            foreach (XmlNode childliste in node.FirstChild.ChildNodes)
                            {
                                if (childliste.Name == "LISTE")
                                {
                                    Liste l;
                                    if (childliste.Attributes.Count == 7)
                                    {
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[6].Value), Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                        foreach (XmlNode childkandidat in childliste.ChildNodes)
                                        {
                                            l.Kandidat.Add(new Kandidat(childkandidat.Attributes[0].Value.ToString(), Convert.ToInt32(childkandidat.Attributes[1].Value)));
                                        }
                                    }
                                    else
                                        l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), -1, Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                    aktuelafstemningsområde.Parti.Add(childliste.Attributes[0].Value.ToString(), l);
                                }
                            }
                            foreach (int i in _valg.Landskreds.Keys)
                            {
                                if (node.Attributes["kreds"].Value.Length > 0)
                                {
                                    if (node.Attributes["kreds"].Value.ToString().Remove(5) == i.ToString().Remove(5))
                                    {
                                        Landskreds aktuellandskreds = _valg.Landskreds[i];
                                        aktuellandskreds.ialt_afgivet += Convert.ToInt32(node.FirstChild.Attributes[8].Value);
                                        aktuellandskreds.forrige_rest += Convert.ToInt32(node.FirstChild.Attributes[7].Value);
                                        aktuellandskreds.forrige_blanke += Convert.ToInt32(node.FirstChild.Attributes[6].Value);
                                        aktuellandskreds.blanke += Convert.ToInt32(node.FirstChild.Attributes[5].Value);
                                        aktuellandskreds.forrige_ugyldige += Convert.ToInt32(node.FirstChild.Attributes[4].Value);
                                        aktuellandskreds.ugyldige += Convert.ToInt32(node.FirstChild.Attributes[3].Value);
                                        aktuellandskreds.stemmeberettigede += Convert.ToInt32(node.FirstChild.Attributes[2].Value);
                                        aktuellandskreds.forrige_pct += Convert.ToDecimal(node.FirstChild.Attributes[1].Value.Replace('.', ','));
                                        aktuellandskreds.stemme_pct += Convert.ToDecimal(node.FirstChild.Attributes[0].Value.Replace('.', ','));
                                        foreach (XmlNode childliste in node.FirstChild.ChildNodes)
                                        {
                                            if (childliste.Name == "LISTE")
                                            {
                                                Liste l;
                                                if (childliste.Attributes.Count == 7)
                                                {
                                                    l = new Liste(childliste.Attributes[1].Value.ToString(), childliste.Attributes[0].Value.ToString(), Convert.ToDecimal(childliste.Attributes[5].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[6].Value), Convert.ToInt32(childliste.Attributes[4].Value), Convert.ToDecimal(childliste.Attributes[3].Value.Replace('.', ',')), Convert.ToInt32(childliste.Attributes[2].Value));
                                                    foreach (XmlNode childkandidat in childliste.ChildNodes)
                                                    {
                                                        l.Kandidat.Add(new Kandidat(childkandidat.Attributes[0].Value.ToString(), Convert.ToInt32(childkandidat.Attributes[1].Value)));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
